import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from functools import partial, partialmethod


class WinForm(QMainWindow):
    def __init__(self, parent=None):
        super(WinForm, self).__init__(parent)
        self.setWindowTitle("有参槽函数接收无参信号的解决方法")

        button1 = QPushButton("Button 1")
        button2 = QPushButton("Button 2")

        # 对于clicked信号来说他是没有参数的，如果连接的槽函数希望可以接收参数，如果直接连接有参数
        # 的槽函数会出错，因为信号发出的参数个数一定要大于槽函数接收的参数个数。这里有两种解决方法：
        # 1.使用lambda
        # 2.使用functools模块中的partial函数

        # 使用lambda
        button1.clicked.connect(lambda: self.onButtonClick(1))
        # button1.clicked.connect(self.onButtonClick)

        # 使用functools模块中的partial函数
        button2.clicked.connect(partial(self.onButtonClick, 2))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)
        mainwidget = QWidget()
        mainwidget.setLayout(layout)
        self.setCentralWidget(mainwidget)

    def onButtonClick(self, n):
        print("Button {0} 被按下了".format(n))
        QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = WinForm()
    win.show()
    sys.exit(app.exec_())
